package rawwrs.dao.jpa;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.struts2.components.Bean;

import rawwrs.bean.UsuarioDTO;
import rawwrs.entity.Usuario;
import rawwrs.util.JPAUtilSingleton;


public class UsuarioJPADAO{
	
	
	@SuppressWarnings("unchecked")
	public List<UsuarioDTO> obtenerTodos(){
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();

		List<UsuarioDTO> usuarios = new ArrayList<UsuarioDTO>();
		 
		List l =  em.createQuery( "SELECT c FROM Usuario c ORDER BY c.id" ).getResultList();
		
		for ( int i=0; i < l.size(); i++ ) {
			Usuario entidadUsuario = (Usuario)l.get(i);
			
			UsuarioDTO dto = new UsuarioDTO(new Integer(entidadUsuario.getId()) , entidadUsuario.getIdusuario(), 
					entidadUsuario.getPerfil(), entidadUsuario.getNombres(), entidadUsuario.getApellidos(), 
					entidadUsuario.getTelefono_casa(), entidadUsuario.getTelefono_celular(), entidadUsuario.getDireccion(),
					entidadUsuario.getEmail(), entidadUsuario.getPassword(), entidadUsuario.getToken(), entidadUsuario.getEstado_usuario(),
					entidadUsuario.getEstado_admin(), entidadUsuario.getTipo_usuario());

			usuarios.add( dto );
		}

		em.close();

		return usuarios;
	}


	public void insertar(UsuarioDTO usuarioDTO){
			EntityManager em = JPAUtilSingleton.
			getInstance().getEmf().createEntityManager();

			em.getTransaction().begin();
			
			Usuario entidadUsuario=new Usuario();
			
			entidadUsuario.setIdusuario (usuarioDTO.getIdusuario() );
			entidadUsuario.setPerfil(usuarioDTO.getPerfil());
			entidadUsuario.setNombres(usuarioDTO.getNombres());
			entidadUsuario.setApellidos(usuarioDTO.getApellidos() );
			entidadUsuario.setTelefono_casa(usuarioDTO.getTelefono_casa());
			entidadUsuario.setTelefono_celular(usuarioDTO.getTelefono_celular());
			entidadUsuario.setDireccion(usuarioDTO.getDireccion());
			entidadUsuario.setEmail(usuarioDTO.getEmail());
			entidadUsuario.setPassword(usuarioDTO.getPassword());
			entidadUsuario.setToken(usuarioDTO.getToken());
			entidadUsuario.setEstado_usuario(1); //Estado del usuario recien ingresado
			entidadUsuario.setEstado_admin(1);//Estado activo para el administrador
			entidadUsuario.setTipo_usuario(1); //
			
			em.persist(entidadUsuario);
			em.flush();
			
			em.getTransaction().commit();
			em.close();
	}

	public void actualizar(UsuarioDTO usuarioDTO) throws Exception {
		
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();

		em.getTransaction().begin();
		
		Usuario entidadUsuario = em.find(Usuario.class, usuarioDTO.getId());

		entidadUsuario.setPerfil(usuarioDTO.getPerfil());
		entidadUsuario.setNombres(usuarioDTO.getNombres());
		entidadUsuario.setApellidos(usuarioDTO.getApellidos() );
		entidadUsuario.setTelefono_casa(usuarioDTO.getTelefono_casa());
		entidadUsuario.setTelefono_celular(usuarioDTO.getTelefono_celular());
		entidadUsuario.setDireccion(usuarioDTO.getDireccion());
		entidadUsuario.setEmail(usuarioDTO.getEmail());
		entidadUsuario.setPassword(usuarioDTO.getPassword());
		entidadUsuario.setToken(usuarioDTO.getToken());

		em.merge(entidadUsuario);
		em.flush();
				
		em.getTransaction().commit();
		em.close();
	}

	
	
public void dar_de_baja(UsuarioDTO usuarioDTO) throws Exception {		
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		em.getTransaction().begin();		
		Usuario entidadUsuario = em.find(Usuario.class, usuarioDTO.getId());	
		entidadUsuario.setEstado_admin(2);		
		em.merge(entidadUsuario);
		em.flush();				
		em.getTransaction().commit();
		em.close();
}
	
	
	
	public void eliminar(UsuarioDTO usuarioDTO) {
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();

		em.getTransaction().begin();

		Usuario entidadUsuario=(Usuario)em.find(Usuario.class,usuarioDTO.getId());

		em.remove(entidadUsuario);
		em.flush();
		
		em.getTransaction().commit();
		em.close();
	}


	public UsuarioDTO obtenerUsuario(UsuarioDTO usuarioDTO){
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
		Usuario entidadUsuario=(Usuario)em.find(Usuario.class,usuarioDTO.getId());

		UsuarioDTO dto = new UsuarioDTO(new Integer(entidadUsuario.getId()) , entidadUsuario.getIdusuario(), 
				entidadUsuario.getPerfil(), entidadUsuario.getNombres(), entidadUsuario.getApellidos(), 
				entidadUsuario.getTelefono_casa(), entidadUsuario.getTelefono_celular(), entidadUsuario.getDireccion(),
				entidadUsuario.getEmail(), entidadUsuario.getPassword(), entidadUsuario.getToken(), entidadUsuario.getEstado_usuario(),
				entidadUsuario.getEstado_admin(), entidadUsuario.getTipo_usuario());
		
		em.close();
		
		return dto;
	}
	
	@SuppressWarnings("unchecked")
	public UsuarioDTO LogeoUsuario(UsuarioDTO usuarioDTO){
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
		javax.persistence.Query query = em.createQuery("SELECT p FROM Usuario p WHERE p.email = :email and p.password = :psw" );

		query.setParameter("email", usuarioDTO.getEmail());
		query.setParameter("psw", usuarioDTO.getPassword());

		List<Usuario> listado = query.getResultList();

		if (listado.size()>0) {
			
			UsuarioDTO bean = new UsuarioDTO();
			bean.setId(listado.get(0).getId());
			bean.setNombres(listado.get(0).getNombres());
			bean.setApellidos(listado.get(0).getApellidos());
			bean.setEmail(listado.get(0).getEmail());
			bean.setEstado_admin(listado.get(0).getEstado_admin());
			bean.setDireccion(listado.get(0).getDireccion());
			bean.setTelefono_casa(listado.get(0).getTelefono_casa());
			bean.setTelefono_celular(listado.get(0).getTelefono_celular());
			if(bean.getEstado_admin()==1){
				em.close();
				return bean;
			}else{
				return null;
			}
					
		} else {
			em.close();
			return null;
		}
	}
	
	
	@SuppressWarnings("unchecked")
	public UsuarioDTO SuccessEmail(String email){
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
		javax.persistence.Query query = em.createQuery("SELECT p FROM Usuario p WHERE p.email = :email" );

		query.setParameter("email", email);

		List<Usuario> listado = query.getResultList();
		if (listado.size()>0) {
			UsuarioDTO bean = new UsuarioDTO();
			bean.setId(listado.get(0).getId());
			bean.setNombres(listado.get(0).getNombres());
			bean.setEmail(listado.get(0).getEmail());
			em.close();
			return bean;
		} else {
			em.close();
			return null;
		}
	}

	
	

}
